/*
 * estructura.h
 *
 *  Created on: 23/09/2011
 *      Author: utn_so
 */

#ifndef ESTRUCTURA_H_
#define ESTRUCTURA_H_

#include <stdint.h>
#include <stdio.h>


//BootSector

/*
typedef signed char int8_t
typedef unsigned char uint8_t
typedef signed int int16_t
typedef unsigned int uint16_t
typedef signed long int int32_t
typedef unsigned long int uint32_t
typedef signed long long int int64_t
typedef unsigned long long int uint64_t */

typedef struct fat_BootSector
{
	uint8_t		booteo[3]; //Primeros 3 bytes del disco
	uint8_t 	oem_name[8]; //8 bytes  datos del DOS
	uint16_t 	bytes_por_sector; // 2 bytes
	uint8_t		sectores_por_cluster; // 1 byte  Numero de sectores por cluster
	uint16_t	numero_sectores_reservados; // 2 bytes Numero de sectores reservados
	uint8_t		numero_tablas_FAT; // 1 byte Numero de tablas FAT
	uint16_t	numero_entradas_directorio; // 2 bytes Numero de entradas de directorios
	uint16_t	total_sectors_16; // 2 bytes Cantidad de sectores en el volumen logico

	uint8_t		media_type; // 1 byte  ...

	uint16_t	table_size_16; // 2 bytes Solo para fat16
	uint16_t	sectores_por_cilindro; // 2 bytes Numero de sectores por cilindro
	uint16_t	numero_cabezas; // 2 bytes Numero de cabezas

	uint32_t    numero_sectores_ocultos; // 4 bytes Numero de sectores ocultos
	uint32_t	total_sectors_32; // 4 bytes  Cantidad total sectores ( mayor a 65535 )

	//Aca empiezan los campos especificos para FAT32

	uint32_t	sectores_por_FAT; // 4 bytes Sectores por FAT
	uint16_t	flags_extendidas; // 2 bytes  flags extendidas

	uint16_t	fat_version; // 2 bytes version de fat

	uint32_t	cluster_raiz; // 4 bytes numero del cluster del directorio raiz (casi siempre en el sector 2)
	uint16_t	cluster_fs_info; // 2 bytes  Numero de cluster del FS info
	uint16_t	backup_cluster; // 2 bytes Numero de cluster del backup boot sector

	uint8_t 		reservados[12]; // 12 bytes (Cuando es formateado tiene que ser 0 )

	uint8_t			drive_number; // 1 byte Numero identico al que retorna el BIOS  para una interrupcion 0x13
	uint8_t 		reservado_1; // 1 byte " reservado"
	uint8_t			boot_signature; // 1 byte signature
	uint32_t		numero_serie; // 4 bytes numero serie
	uint8_t			volume_label[11]; // 11 bytes  Se llena con espacios

	uint8_t			fat_indentificador[8]; // 8 bytes indentificador de FAT32  para el sistema


}__attribute__((packed)) fat_BootSector;


// FAT32 informacion del file system

typedef struct fat_informacion_Sector {
	uint32_t 	firstSignature;             		 // 4 bytes                                                                                             */
	uint8_t  	desconocido[480];               // Deben ser 0                                                                */
	uint32_t 	signatureFSInfo;              	// 4 bytes                                                                                                    */
	int32_t 	numeroDeSectoresLibres;  			// 4 bytes Debe ser -1
	uint32_t 	ClusterUsadoMasRecientemente; 	// 4 bytes  No se usa , puede ser 0
	uint8_t  	reservado[12]; 					// 12 bytes reservados
	uint32_t  desconocido2; // 2 bytes desconocidos , puede ser 0 o NULL
	uint32_t 	signatureBootRegistro;  // 2 bytes
}__attribute__ ((packed)) fat_informacion_Sector;


 // Estructura de la entrada de directorio


typedef struct fat_entrada {
	uint8_t  nombre[11];               // 11 bytes primeros 8 caracteres son el nombre y ultimos 3 la extencion
	uint8_t  atributos;            // 1 byte 0x01 Read Only , 0x02 hidden , 0x04 system , 0x08 volume label , 0x10 subdirectory , 0x20 archivo , 0x40 device (solo uso interno) , 0x80 unused , 0x0f long file name entry
	uint8_t  reservado;            // 1 byte para windows NT  va con 0
	uint8_t  duracionDeCreacioMs;     // 1 byte , tiempo de creacion en milisegundos ( 0-199)
	uint16_t tiempoCreacion ;       // 2 bytes , tiempo en el que se creo (0-4) bits segundos ,(5-10) minutos ,(11-15) horas  siempre empiezan en 0
	uint16_t fechaCreacion;          // 2 bytes (0-4) dia , (5-8) mes , (9-15) año ( 0 es igual a 1980)
	uint16_t fechaDelUltimoAcceso;        // 2 bytes *como la fecha de creacion
	uint16_t primerClusterHi;        //   los 2 bytes mas altos del primer cluster
	uint16_t ultimoTiempoDeModificacion;      // 2 bytes * como tiempo de creacion
	uint16_t ultimaFechaDeModificacion;      // 2 bytes *como fecha de Creacion
	uint16_t primerClusterLow;       // los 2 bytes mas bajos del primer cluster
	uint32_t tamanioDelArchivo;     // tamaño del archivo en bytes , entradas con el volume label o de subdirectorio flag deben tener 0


}__attribute__ ((packed)) fat_entrada;



typedef struct fat_nombreLargo {
	uint8_t  sequencia;        // 1 byte  Ayuda a saber en que parte del nombre del archivo deben ser colocados los caracteres de esta entrada
	uint16_t nombreParte1[5];          // 10 bytes primeros 5 caracteres en UNICODE
	uint8_t  atributos;            // 1 byte Siempre 0x0F ( atributo del nombre largo)
	uint8_t  reservado;                      // 1 byteReservado, siempre 0x00
	uint8_t  checksum;                      // 1 byte checksum del DOS filename
	uint16_t nombreParte2[6];          // 12 bytes siguientes 6 caracteres del nombre
	uint16_t numeroDelPrimerCluster;  // 2 bytes siempre es 0
	uint16_t nombreParte3[2];          // ultimos 2 caracteres
} __attribute__ ((packed)) fat_nombreLargo;

#endif /* ESTRUCTURA_H_ */
